// 小程序练习1
// 扫描指定⽬录，并找到名称中包含指定字符的所有普通⽂件（不包含⽬录），
// 并且后续询问⽤⼾是否要删除该⽂件

// 导入输入输出相关的类
import java.io.*;
// 导入集合框架相关的类
import java.util.*;

public class Demo1 {
    public static void main(String[] args) throws IOException {
        // 创建一个 Scanner 对象，用于从控制台读取用户输入
        Scanner sc = new Scanner(System.in);
        // 提示用户输入要扫描的根目录
        System.out.println("请输入要扫描的根目录（绝对路径 OR 相对路径）：");
        //D:\文件测试
        // 读取用户输入的根目录路径
        String root = sc.next();

        // 根据用户输入的路径创建一个 File 对象
        File file = new File(root);
        // 检查该路径是否为一个目录
        if(!file.isDirectory()){
            // 如果不是目录，输出错误信息
            System.out.println("您输入的根目录不存在或者不是一个目录！");
            // 结束程序
            return;
        }

        // 提示用户输入要找出的文件名中的字符
        System.out.println("请输入要找出的文件名中的字符：");
        // 读取用户输入的字符
        String token = sc.next();

        // 创建一个 ArrayList 用于存储找到的文件
        List<File> list = new ArrayList<>();
        // 调用 findFile 方法开始查找文件
        findFile(file,token,list);
        // 输出找到的文件数量
        System.out.println("共找到"+list.size()+"个文件");
        // 遍历找到的文件列表
        for(File f : list){
            // 输出文件的规范路径，并询问用户是否要删除该文件
            System.out.println(f.getCanonicalPath()+"   请问是否要删除？（Y/N）");
            // 读取用户的选择
            String choice = sc.next();
            // 检查用户是否选择删除
            if(choice.equals("Y") || choice.equals("y")){
                // 删除文件
                f.delete();
                // 输出文件已删除的信息
                System.out.println(f.getCanonicalPath()+"已删除");
            }
        }
    }

    /**
     * 递归查找指定目录下名称包含指定字符的文件
     * @param file 要扫描的目录或文件
     * @param token 要查找的文件名中的字符
     * @param list 用于存储找到的文件的列表
     */
    private static void findFile(File file, String token, List<File> list) {
        // 获取当前目录下的所有文件和子目录
        File[] files = file.listFiles();
        // 检查当前目录是否为空
        if(files == null || files.length == 0){
            // 如果为空，直接返回
            return;
        }
        // 遍历当前目录下的所有文件和子目录
        for(File f : files){
            // 检查当前文件是否为目录
            if(f.isDirectory()){
                // 如果是目录，递归调用 findFile 方法
                findFile(f,token,list);
            }else{
                // 如果是文件，检查文件名是否包含指定字符
                if(f.getName().contains(token)){
                    // 如果包含，将文件添加到列表中
                    list.add(f);
                    // 此处存在逻辑错误，不应添加当前目录的绝对文件，应移除该语句
                    // list.add(file.getAbsoluteFile());
                    System.out.println("当前目录的绝对文件：" + f.getAbsoluteFile());
                }
            }
        }
    }
}
